package org.liuwei.concucrent.base02_cas.AtomicStampedReference_05;

import java.util.concurrent.atomic.AtomicStampedReference;

/**
 * 
 * @Title: AtomicStampedReferenceTest.java
 * @Package org.liuwei.concucrent.base02_cas.AtomicStampedReference_05
 * @Description: TODO(用一句话描述该文件做什么)
 * @author 刘伟 15818570028@163.com
 * @date 2016年8月18日 下午10:49:23
 * @version V1.0
 * 
 */
public class AtomicStampedReferenceTest {

	public final static AtomicStampedReference<String> ATOMIC_REFERENCE = new AtomicStampedReference<String>(
			"abc", 0);

	public static void main(String[] args) {
		for (int i = 0; i < 100; i++) {
			final int num = i;
			final int stamp = ATOMIC_REFERENCE.getStamp();
			new Thread() {
				public void run() {
					try {
						Thread.sleep(Math.abs((int) (Math.random() * 100)));
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					if (ATOMIC_REFERENCE.compareAndSet("abc", "abc2", stamp,
							stamp + 1)) {
						System.err.println(stamp);
						System.out.println("我是线程：" + num + ",我获得了锁进行了对象修改！");
					}
				}
			}.start();
		}
		new Thread() {
			public void run() {
				int stamp = ATOMIC_REFERENCE.getStamp();
				
				System.err.println(stamp);
				while (!ATOMIC_REFERENCE.compareAndSet("abc2", "abc", stamp,
						stamp + 1))
					;
				System.out.println("已经改回为原始值！");
			}
		}.start();
	}

	// 而类：AtomicMarkableReference和AtomicStampedReference功能差不多，
	// 有点区别的是：它描述更加简单的是与否的关系，通常ABA问题只有两种状态，
	// 而AtomicStampedReference是多种状态，
	// 那么为什么还要有AtomicMarkableReference呢，
	// 因为它在处理是与否上面更加具有可读性，而AtomicStampedReference过于随意定义状态，
	// 并不便于阅读大量的是和否的关系，它可以被认为是一个计数器或状态列表等信息，
	// java提倡通过类名知道其意义，所以这个类的存在也是必要的，
	// 它的定义就是将数据变换为true|false如下：
	// public final static AtomicMarkableReference
	// <String>ATOMIC_MARKABLE_REFERENCE = new
	// AtomicMarkableReference<String>("abc" , false);
}